BMV2_SWITCH_EXE = simple_switch_grpc

# ECN 实验配置
P4C_OUTPUT = ecn
CONTROLLER_SCRIPT = ecn_controller.py
TOPOLOGY_SCRIPT = topology.py

# 默认阈值配置（可通过命令行覆盖）
ECN_THRESHOLD_S1 ?= 5
ECN_THRESHOLD_S2 ?= 10
ECN_THRESHOLD_S3 ?= 15

include ../../utils/Makefile

# 运行ECN控制器（使用默认阈值）
run-controller:
	sudo python3 $(CONTROLLER_SCRIPT) --p4info $(BUILD_DIR)/$(P4C_OUTPUT).p4info.txt --bmv2-json $(BUILD_DIR)/$(P4C_OUTPUT).json

# 运行ECN控制器（自定义阈值）
run-controller-custom:
	sudo python3 $(CONTROLLER_SCRIPT) --p4info $(BUILD_DIR)/$(P4C_OUTPUT).p4info.txt --bmv2-json $(BUILD_DIR)/$(P4C_OUTPUT).json --threshold-s1 $(ECN_THRESHOLD_S1) --threshold-s2 $(ECN_THRESHOLD_S2) --threshold-s3 $(ECN_THRESHOLD_S3)

# 启动拓扑并运行控制器
start-ecn: stop
	@echo "启动ECN实验拓扑..."
	$(SUDO) python3 $(TOPOLOGY_SCRIPT) --behavioral-exe $(BMV2_SWITCH_EXE) --json $(BUILD_DIR)/$(P4C_OUTPUT).json &
	@sleep 8
	@echo "启动ECN控制器..."
	$(MAKE) run-controller

# 启动拓扑并使用自定义阈值
start-ecn-custom: stop
	@echo "启动ECN实验拓扑（自定义阈值）..."
	$(SUDO) python3 $(TOPOLOGY_SCRIPT) --behavioral-exe $(BMV2_SWITCH_EXE) --json $(BUILD_DIR)/$(P4C_OUTPUT).json &
	@sleep 8
	@echo "启动ECN控制器（S1:$(ECN_THRESHOLD_S1), S2:$(ECN_THRESHOLD_S2), S3:$(ECN_THRESHOLD_S3)）..."
	$(MAKE) run-controller-custom

# 快速测试：使用低阈值快速触发ECN标记
start-ecn-fast:
	$(MAKE) start-ecn-custom ECN_THRESHOLD_S1=3 ECN_THRESHOLD_S2=3 ECN_THRESHOLD_S3=3

# 清理控制器日志
clean-logs:
	$(SUDO) rm -rf logs/*.txt
	@echo "已清理控制器日志"

# 完全清理（包括控制器日志）
clean-all: clean clean-logs

# 显示ECN帮助信息
help-ecn:
	@echo "ECN 实验专用命令:"
	@echo "  run-controller       - 运行ECN控制器（默认阈值）"
	@echo "  run-controller-custom - 运行ECN控制器（自定义阈值）"
	@echo "  start-ecn           - 启动拓扑并运行控制器（默认阈值）"
	@echo "  start-ecn-custom    - 启动拓扑并运行控制器（自定义阈值）"
	@echo "  start-ecn-fast      - 快速测试：使用低阈值快速触发ECN"
	@echo "  clean-logs          - 清理控制器日志"
	@echo "  clean-all           - 完全清理（包括编译输出和日志）"
	@echo ""
	@echo "自定义阈值用法:"
	@echo "  make start-ecn-custom ECN_THRESHOLD_S1=5 ECN_THRESHOLD_S2=8 ECN_THRESHOLD_S3=12"

# 将ECN帮助信息添加到默认help目标
help: help-ecn

# 测试命令（可选）
test-ecn: compile
	@echo "编译ECN程序完成，可以使用 start-ecn 命令开始实验"
